$OpenBSD: patch-xdu_c,v 1.1 2007/10/26 20:59:01 jasper Exp $
--- xdu.c.orig	Sun Jun  5 21:29:23 1994
+++ xdu.c	Fri Oct 26 22:44:33 2007
@@ -235,6 +235,7 @@ char *filename;
 	char	name[4096];
 	int	size;
 	FILE	*fp;
+	char	*p, *n;
 
 	if (strcmp(filename, "-") == 0) {
 		fp = stdin;
@@ -244,11 +245,21 @@ char *filename;
 			exit(1);
 		}
 	}
+
 	while (fgets(buf,sizeof(buf),fp) != NULL) {
-		sscanf(buf, "%d %s\n", &size, name);
+		p = buf;
+		while (*p && isspace(*p)) p++;
+		size = atoi(p);
+		while (*p && !isspace(*p)) p++;
+		while (*p && isspace(*p)) p++;
+		n = name;
+		while (*p && *p != '\n' && *p != '\r')
+			*n++ = *p++;
+		*n++ = '\0';
 		/*printf("%d %s\n", size, name);*/
 		parse_entry(name,size);
 	}
+
 	fclose(fp);
 }
 
@@ -269,7 +280,7 @@ int size;
 	length = strlen(name);
 	if ((length > 0) && (name[length-1] == '/')) {
 		/* strip off trailing / (e.g. GNU du) */
-		name[length-1] = 0;
+		name[--length] = 0;
 	}
 
 	arg = 0; indx = 0;
@@ -289,8 +300,10 @@ int size;
 		}
 		name++;
 	}
-	buf[indx] = 0;
-	path[arg++] = strdup(buf);
+	if (length) {
+		buf[indx] = 0;
+		path[arg++] = strdup(buf);
+	}
 	path[arg] = NULL;
 
 	addtree(&top,path,size);
@@ -399,15 +412,15 @@ int size;
 
 	/*printf("addtree(\"%s\",\"%s\",%d)\n", top->name, path[0], size);*/
 
+	if (path[0] == NULL) {
+		/* end of the chain, save size */
+		top->size = size;
+		return;
+	}
+
 	/* check all children for a match */
 	for (np = top->child; np != NULL; np = np->peer) {
 		if (strcmp(path[0],np->name) == 0) {
-			/* name matches */
-			if (path[1] == NULL) {
-				/* end of the chain, save size */
-				np->size = size;
-				return;
-			}
 			/* recurse */
 			addtree(np,&path[1],size);
 			return;
